package de.dis2011.data;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import de.dis2011.data.DB2ConnectionManager;

public class Kaufvertrag extends Vertrag
{
    private int anzahlraten;
    private int ratenzins;
    private int verkaeufer;
    private int objekt;

    public int getAnzahlraten()
    {
        return anzahlraten;
    }

    public void setAnzahlraten(int anzahlraten)
    {
        this.anzahlraten = anzahlraten;
    }

    public int getRatenzins()
    {
        return ratenzins;
    }

    public void setRatenzins(int ratenzins)
    {
        this.ratenzins = ratenzins;
    }

    public int getVerkaeufer()
    {
        return verkaeufer;
    }

    public void setVerkaeufer(int verkaeufer)
    {
        this.verkaeufer = verkaeufer;
    }

    public int getObjekt()
    {
        return objekt;
    }

    public void setObjekt(int objekt)
    {
        this.objekt = objekt;
    }

    /**
     * Lädt einen Vertrag aus der Datenbank
     * 
     * @param id
     *            ID des zu ladenden Vertrags
     * @return Vertrag-Instanz
     */
    public static Kaufvertrag load(int id)
    {
        try
        {
            // Hole Verbindung
            Connection con = DB2ConnectionManager.getInstance().getConnection();

            // Erzeuge Anfrage
            String selectSQL = "SELECT * FROM kaufvertrag WHERE id = ?";
            PreparedStatement pstmt = con.prepareStatement(selectSQL);
            pstmt.setInt(1, id);

            // Führe Anfrage aus
            ResultSet rs = pstmt.executeQuery();
            if (rs.next())
            {
                Kaufvertrag ts = new Kaufvertrag();
                ts.setId(id);
                ts.setVertragsnummer(rs.getInt("vertragsnummer"));
                ts.setDatum(rs.getDate("datum"));
                ts.setOrt(rs.getString("ort"));
                ts.setAnzahlraten(rs.getInt("anzahlraten"));
                ts.setRatenzins(rs.getInt("ratenzins"));
                ts.setVerkaeufer(rs.getInt("verkaeufer"));
                ts.setObjekt(rs.getInt("objekt"));

                rs.close();
                pstmt.close();
                return ts;
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Speichert den Vertrag in der Datenbank. Ist noch keine ID vergeben
     * worden, wird die generierte Id von DB2 geholt und dem Model übergeben.
     */
    public void save()
    {
        super.save();
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Achtung, hier wird noch ein Parameter mitgegeben,
            // damit später generierte IDs zurückgeliefert werden!
            String insertSQL = "Insert INTO kaufvertrag(id, vertragsnummer, datum, ort, anzahlraten, ratenzins, verkaeufer, objekt) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";

            PreparedStatement pstmt = con.prepareStatement(insertSQL, Statement.RETURN_GENERATED_KEYS);

            // Setze Anfrageparameter und führe Anfrage aus
            pstmt.setInt(1, getId());
            pstmt.setInt(2, getVertragsnummer());
            pstmt.setDate(3, (Date) getDatum());
            pstmt.setString(4, getOrt());
            pstmt.setInt(5, getAnzahlraten());
            pstmt.setInt(6, getRatenzins());
            pstmt.setInt(7, getVerkaeufer());
            pstmt.setInt(8, getObjekt());
            pstmt.executeUpdate();

            // Hole die Id des engefügten Datensatzes
            ResultSet rs = pstmt.getGeneratedKeys();
            if (rs.next())
            {
                setId(rs.getInt(1));
            }

            rs.close();
            pstmt.close();

        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void delete()
    {
        super.delete();
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Lösche Element, wenn das Objekt noch keine ID hat.
            if (getId() == -1)
            {
                System.out.println("Was nicht vorhanden ist, kann nicht gelöscht werden");
            }
            else
            {
                String deleteSQL = "DELETE FROM vertrag WHERE id = ?";

                PreparedStatement pstmt = con.prepareStatement(deleteSQL);

                // Setze Anfrage Parameter
                pstmt.setInt(1, getId());
                pstmt.executeUpdate();

                pstmt.close();

            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void edit()
    {
        super.edit();
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Lösche Element, wenn das Objekt noch keine ID hat.
            if (getId() == -1)
            {
                System.out.println("Was nicht vorhanden ist, kann nicht geändert werden");
            }
            else
            {
                // Falls schon eine ID vorhanden ist, mache ein Update...
                String updateSQL = "UPDATE kaufvertrag SET vertragsnummer = ?, datum = ? ort = ?, anzahlraten = ?, ratenzins = ?, verkaeufer = ?, objekt = ? WHERE id = ?";

                PreparedStatement pstmt = con.prepareStatement(updateSQL);

                // Setze Anfrage Parameter
                pstmt.setInt(1, getVertragsnummer());
                pstmt.setDate(2, (Date) getDatum());
                pstmt.setString(3, getOrt());
                pstmt.setInt(4, getAnzahlraten());
                pstmt.setInt(5, getRatenzins());
                pstmt.setInt(6, getVerkaeufer());
                pstmt.setInt(7, getObjekt());
                pstmt.setInt(8, getId());
                pstmt.executeUpdate();

                pstmt.close();

            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }
}
